package com.atguigu.self.service.impl;

import com.atguigu.self.constant.CacheAbleConstant;
import com.atguigu.self.service.CacheOpsService;
import com.atguigu.self.utils.Jsons;
import com.fasterxml.jackson.core.type.TypeReference;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.redis.core.StringRedisTemplate;
import org.springframework.util.StringUtils;

import java.util.concurrent.TimeUnit;
import java.util.regex.Pattern;


//@Service
public class CacheOpsServiceImpl implements CacheOpsService {

    @Autowired
    private StringRedisTemplate redisTemplate;


    @Override
    public <T> T getDataFromCache(String cacheKey, Class<T> t) {

        // 1.查询缓存("null","{}","[]")
        String jsonStrFromCache = redisTemplate.opsForValue().get(cacheKey);

        if (StringUtils.isEmpty(jsonStrFromCache)) {
            return null;
        }
        // 2.反序列化操作
        // 3.返回反序列化之后的对象
        return Jsons.jsonToObj(jsonStrFromCache, t);
    }

    @Override
    public <T> T getDataFromCache(String cacheKey, TypeReference<T> typeReference) {

        // 1.查询缓存("null","{}","[]")
        String jsonStrFromCache = redisTemplate.opsForValue().get(cacheKey);

        if (StringUtils.isEmpty(jsonStrFromCache)) {
            return null;
        }
        // 2.反序列化操作
        // 3.返回反序列化之后的对象
        return Jsons.jsonToObj(jsonStrFromCache, typeReference);
    }

    @Override
    public void saveDataToCache(String cacheKey, Object object) {

//        ArrayList<String> list = new ArrayList<>();
//        list.add("^\\{\\}$");
//        list.add("^null$");
//        list.add("^\\[\\]$");

        // 1.将要保存的数据序列化成一个字符串(new  AarrayList)
        //  null User List  Set Map （数组类型）..
        String serializableStr = Jsons.objToStr(object);
        long ttl;
//        if (regexRule("^null$", serializableStr) || regexRule("^\\{\\}$", serializableStr) || regexRule("^\\[\\]$", serializableStr)) {
//            // 时间短一些
//            ttl = CacheAbleConstant.SYNC_HAS_NO_DATA_TTL;
//        } else {
//            ttl = CacheAbleConstant.SYNC_HAS_DATA_TTL;
//        }
        // 责任链模式 TODO
//        for (String regex : list) {
//            // "null" "{}" "[]" "{完整数据的json}"
//            if (regexRule(regex, serializableStr)) {
//                ttl = 30l;
//            } else {
//                ttl = 60 * 24 * 7l;
//            }
//        }
        //适配器模式
        ttl = CacheAbleConstant.SYNC_HAS_DATA_TTL;
        for (String regex : Jsons.getAppAllRegex()) {
            // "null" "{}" "[]" "{完整数据的json}"
            if (regexRule(regex, serializableStr)) {
                ttl = CacheAbleConstant.SYNC_HAS_NO_DATA_TTL;
            }
        }

        // 2.同步数据到缓存(给过期时间【可以解决数据的最终一致性以及冷数据淘汰不占用内存空间】)
        redisTemplate.opsForValue().set(cacheKey, serializableStr, ttl, TimeUnit.MINUTES);

    }

    public boolean regexRule(String rule, String compareContent) {
        return Pattern.matches(rule, compareContent);
    }
}
